#ifndef _OTA_H
#define _OTA_H

#include <functional>
#include <string>
#include <map>

/**
 * @brief OTA（空中下载）更新管理类
 * 
 * 该类负责固件版本检查和更新，支持远程固件升级功能
 */
class Ota {
public:
    /**
     * @brief 构造函数
     */
    Ota();
    
    /**
     * @brief 析构函数
     */
    ~Ota();

    /**
     * @brief 设置检查版本的URL
     * @param check_version_url 版本检查服务器URL
     */
    void SetCheckVersionUrl(std::string check_version_url);
    
    /**
     * @brief 设置HTTP请求头
     * @param key 请求头键名
     * @param value 请求头值
     */
    void SetHeader(const std::string& key, const std::string& value);
    
    /**
     * @brief 检查是否有新版本可用
     * @return 检查成功返回true，否则返回false
     */
    bool CheckVersion();
    
    /**
     * @brief 检查是否有新版本
     * @return 有新版本返回true，否则返回false
     */
    bool HasNewVersion() { return has_new_version_; }
    
    /**
     * @brief 检查是否有MQTT配置
     * @return 有MQTT配置返回true，否则返回false
     */
    bool HasMqttConfig() { return has_mqtt_config_; }
    
    /**
     * @brief 检查是否有激活码
     * @return 有激活码返回true，否则返回false
     */
    bool HasActivationCode() { return has_activation_code_; }
    
    /**
     * @brief 检查是否有服务器时间
     * @return 有服务器时间返回true，否则返回false
     */
    bool HasServerTime() { return has_server_time_; }
    
    /**
     * @brief 开始固件升级
     * @param callback 升级进度回调函数，参数为进度百分比和下载速度
     */
    void StartUpgrade(std::function<void(int progress, size_t speed)> callback);
    
    /**
     * @brief 标记当前版本为有效
     */
    void MarkCurrentVersionValid();

    /**
     * @brief 获取可用的固件版本
     * @return 固件版本字符串
     */
    const std::string& GetFirmwareVersion() const { return firmware_version_; }
    
    /**
     * @brief 获取当前运行的固件版本
     * @return 当前版本字符串
     */
    const std::string& GetCurrentVersion() const { return current_version_; }
    
    /**
     * @brief 获取激活消息
     * @return 激活消息字符串
     */
    const std::string& GetActivationMessage() const { return activation_message_; }
    
    /**
     * @brief 获取激活码
     * @return 激活码字符串
     */
    const std::string& GetActivationCode() const { return activation_code_; }

private:
    std::string check_version_url_;      ///< 版本检查URL
    std::string activation_message_;     ///< 激活消息
    std::string activation_code_;        ///< 激活码
    bool has_new_version_ = false;       ///< 是否有新版本标志
    bool has_mqtt_config_ = false;       ///< 是否有MQTT配置标志
    bool has_server_time_ = false;       ///< 是否有服务器时间标志
    bool has_activation_code_ = false;   ///< 是否有激活码标志
    std::string current_version_;        ///< 当前固件版本
    std::string firmware_version_;       ///< 可用的新固件版本
    std::string firmware_url_;           ///< 固件下载URL
    std::map<std::string, std::string> headers_;  ///< HTTP请求头

    /**
     * @brief 执行固件升级
     * @param firmware_url 固件下载URL
     */
    void Upgrade(const std::string& firmware_url);
    
    /**
     * @brief 升级进度回调函数
     */
    std::function<void(int progress, size_t speed)> upgrade_callback_;
    
    /**
     * @brief 解析版本字符串为数字数组
     * @param version 版本字符串，如"1.2.3"
     * @return 版本号数组，如[1,2,3]
     */
    std::vector<int> ParseVersion(const std::string& version);
    
    /**
     * @brief 检查是否有新版本可用
     * @param currentVersion 当前版本字符串
     * @param newVersion 新版本字符串
     * @return 有新版本返回true，否则返回false
     */
    bool IsNewVersionAvailable(const std::string& currentVersion, const std::string& newVersion);
};

#endif // _OTA_H
